home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok72.lha / while-Interpreter / Source / QuadLese.MOD < prev    next >
Text File  |  1993-08-15  |  4KB  |  114 lines

  1.  
  2. IMPLEMENTATION MODULE QuadLese;
  3.  
  4. FROM InOut IMPORT Read, WriteLn, Write, WriteString;
  5.  
  6.  
  7. PROCEDURE LeseZeichen() : CHAR;
  8. VAR ch      : CHAR;
  9.     korrekt : BOOLEAN;        (* Eingabe eines korrekten Zeichens. *)
  10. BEGIN
  11.   korrekt:=FALSE;
  12.   WHILE NOT(korrekt) DO
  13.     Read(ch);
  14.     CASE ch OF
  15.       "b" : korrekt:=TRUE;
  16.     | "B" : korrekt:=TRUE;ch:="b";      (* begin *)
  17.     | "e" : korrekt:=TRUE;
  18.     | "E" : korrekt:=TRUE;ch:="e";      (* end   *)
  19.     | "w" : korrekt:=TRUE;
  20.     | "W" : korrekt:=TRUE;ch:="w";      (* while *)
  21.     | "d" : korrekt:=TRUE;
  22.     | "D" : korrekt:=TRUE;ch:="d";      (* do    *)
  23.     | ":" : korrekt:=TRUE;              (* :=    *)             (* Zuweisung *)
  24.     | "#" : korrekt:=TRUE;              (* #     *)
  25.     | "s" : korrekt:=TRUE;
  26.     | "S" : korrekt:=TRUE;ch:="s";      (* succ  *)
  27.     | "p" : korrekt:=TRUE;
  28.     | "P" : korrekt:=TRUE;ch:="p";      (* pred  *)
  29.     | ";" : korrekt:=TRUE;              (* ;     *)
  30.     | "(" : korrekt:=TRUE;              (* (     *)
  31.     | ")" : korrekt:=TRUE;              (* )     *)
  32.     | "x" : korrekt:=TRUE;ch:="X";
  33.     | "X" : korrekt:=TRUE;              (* X     *)              (* Variable *)
  34.     | "u" : korrekt:=TRUE;ch:="U";                          (* Unterprogramm *)
  35.     | "U" : korrekt:=TRUE;
  36.     ELSE
  37.       IF (ch >= "0") AND (ch <= "9") THEN                          (* Zahlen *)
  38.         korrekt:=TRUE;
  39.       ELSE
  40.                                       (* Fehlerhafte Eingabe eines Zeichens. *)
  41.       END;
  42.     END;       (* OF CASE *)
  43.   END;
  44.   Write(ch);
  45.   RETURN ch;
  46. END LeseZeichen;
  47.  
  48.  
  49. PROCEDURE Lese(VAR Liste : arrList);
  50. VAR i,                       (* Schleifenzaehler *)
  51.     begin     : CARDINAL;    (* Zaehler fuer noch offene 'begin' Anweisungen *)
  52.     ch        : CHAR;
  53. BEGIN
  54.   WriteString("Eingabe des while-Programms.");WriteLn;
  55.   WriteString("Geben Sie bitte folgende Zeichen fuer die jeweiligen");
  56.   WriteString(" Befehle ein.");WriteLn;WriteLn;
  57.   WriteString(" 'b' <-> begin     'e' <-> end");WriteLn;
  58.   WriteString(" 'w' <-> while     'd' <-> do");WriteLn;
  59.   WriteString(" ':' <-> :=        '#' <-> #");WriteLn;
  60.   WriteString(" 's' <-> succ      'p' <-> pred");WriteLn;
  61.   WriteLn;
  62.   WriteString("Ausserdem sind noch folgende Zeichen erlaubt :");WriteLn;
  63.   WriteString(" ';'    '('    ')'    '0'    '1'    '2'    '3'");WriteLn;
  64.   WriteString(" '4'    '5'    '6'    '7'    '8'    '9'    'X'");WriteLn;
  65.   WriteLn;
  66.   WriteString("Ausserdem steht 'U#' fuer einige Unterprogramme.");WriteLn;
  67.   WriteString("Das Ergebnis steht in X1. X0 - X9 sind Eingabevariablen.");
  68.   WriteLn;
  69.   WriteString(" U1 <--> Addition       X1 := X1 + X2.");WriteLn;
  70.   WriteString(" U2 <--> Subtraktion    X1 := X1 - X2.");WriteLn;
  71.   WriteString(" U3 <--> Multiplikation X1 := X1 * X2.");WriteLn;
  72.   WriteString(" U4 <--> Division       X1 := X1 DIV X2.");WriteLn;
  73.   WriteString(" U5 <--> Modular        X1 := X1 MOD X2.");WriteLn;
  74.   WriteLn;
  75.   WriteString("Beispiele fuer korrekte while-Programme :");WriteLn;
  76.   WriteString("          bwX1#x2dwX1#X4dX1:s(X1);X2:X4e");WriteLn;
  77.   WriteString(" ergibt : begin");WriteLn;
  78.   WriteString("            while X1 # X2 do");WriteLn;
  79.   WriteString("              while X1 # X4 do");WriteLn;
  80.   WriteString("                X1:=succ(X1);");WriteLn;
  81.   WriteString("            X2:=X4");WriteLn;
  82.   WriteString("          end");WriteLn;
  83.   WriteLn;
  84.   WriteLn;
  85.   WriteString("Geben Sie jetzt Ihr Programm gemaess obiger Definition ein : ");
  86.   WriteLn;
  87.  
  88.   ch:=LeseZeichen();
  89.   IF ch # 'b' THEN
  90.     WriteString("Dies kann kein korrektes while-Programm sein!!!");WriteLn;
  91.     WriteLn;
  92.     HALT;
  93.   ELSE
  94.     Liste[1]:='b';
  95.     i:=2;
  96.     begin:=1;
  97.     WHILE begin # 0 DO
  98.       ch:=LeseZeichen();
  99.       IF ch = 'b' THEN INC(begin) END;
  100.       IF ch = 'e' THEN DEC(begin) END;
  101.       Liste[i]:=ch;
  102.       INC(i);
  103.       IF i > MaxBefehle THEN
  104.         WriteString("Out of Memory!!! Erhoehe MaxBefehle.");WriteLn;
  105.         WriteLn;
  106.         HALT;
  107.       END;
  108.     END;
  109.   END;
  110. END Lese;
  111.  
  112. END QuadLese.
  113.  
  114.